Oficina 3

CE II: Visualização de dados - ggplot2

Carolina Musso

DEPAT/IPE-DF

Luiz Oliveira
Rafael de Acypreste

O pacote ggplot2

Um pacote (extensão do R) para visualização de dados muito famoso no meio de Ciência de Dados.

  • Ele faz parte do tidyverse.

O que vamos (começar) aprender nessa aula

A lógica do ggplot2

A lógica do ggplot

  • O “canvas” vazio
penguins |> 
  ggplot()

  • Os dados (eixos)
penguins |> 
  ggplot()+
  aes(x = body_mass_g, 
      y = flipper_length_mm)

  • A geometria
penguins |> 
  ggplot()+
  aes(x = body_mass_g, 
      y = flipper_length_mm) |> 
  geom_point()

  • As firulas
penguins %>%
  ggplot(aes(x = body_mass_g, y = flipper_length_mm, color = species)) +
  geom_point(size = 3) +
  scale_color_brewer("Espécie", palette = "Set2") +  # Defina cores chamativas
  labs(title = "Relação entre Massa Corporal e Comprimento da Nadadeira",   # Título
       subtitle = "Base de Dados Palmer Penguins",                           # Subtítulo
       x = "Massa Corporal (g)",                                             # Rótulo do eixo X
       y = "Comprimento da Nadadeira (mm)") +                                 # Rótulo do eixo Y
  annotate("text", x = 4800, y = 215,
           label = "Gentoo tem o maior tamanho corporal",               # Adiciona anotação
           color = "black",
           size = 5, 
           fontface = "bold",
           angle = 30
           ) +
  theme_classic()  # Estilo do tema

Lógica do ggplot

As camadas são adicionadas com um “+”

  • Diferença + para %>% ou |>
  • Há as partes estáticas e partes que dinâmicas (que respondem aos dados)
  • Cuidado com as aspas (principalmente nas opções de parâmetros)!
  • Conheça as variáveis (numéricas ou categóricas)
  • É preciso ter no mínimo a função ggplot() e uma função de geometria geom_?()
  • Há várias formas de escrever a mesma coisa!

Várias formas de fazer a mesma coisa

ggplot(data = cars) + 
  geom_point(mapping = aes(x = speed, 
                        y = dist))

ggplot(cars) + 
  geom_point(aes(x = speed, y = dist))

ggplot(cars, aes(x = speed, y = dist)) + 
  geom_point( )

ggplot(cars) + 
  aes(x = speed, y = dist) +
  geom_point()

cars  |>  # atenção que aqui ainda é o pipe!
ggplot() + 
  aes(x = speed, y = dist) +
  geom_point()

Vamos ao R-Studio!

Desafio

  • Diferença do fill= dentro ou fora do aes() ?
ggplot(penguins) + 
  geom_point(aes(x = body_mass_g , y = flipper_length_mm), color = species)

  • O que aconteceu aqui?

Mapeamento dos dados

ggplot(mpg, aes(x = displ, y = hwy, color=class)) + 
  geom_point( )

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point(aes(color=class))

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point(color="blue")

Faceting

ggplot(penguins)+
  geom_point(aes(x = body_mass_g, 
                y = flipper_length_mm, 
                color = species)) +
  facet_grid(year ~ island)

Vamos ao R-Studio!

Pacote Esquisse

Customizações

Temas

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point()

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point() +
  theme_minimal()

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point()+
  theme_bw(base_size=20)

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point() +
  theme_classic()

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point() +
  theme_void()

ggthemes

pacman::p_load(ggthemes)

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point() +
  theme_economist()

pacman::p_load(ggthemes)

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point() +
  theme_solarized()

pacman::p_load(ggthemes)

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point()+
  theme_excel()

Fazer o próprio tema

ggplot(mpg) + 
  aes(x = displ, y = hwy) +
  geom_point(color="white") +
  theme(
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5),
    axis.title = element_text(color = "purple"),
    panel.background = element_rect(fill = "black"),
    panel.grid = element_blank()
  )

  • faça ?theme e veja quantos parâmetros essa função tem!

Cores

colorspace::hcl_color_picker()

Escala Manual

ggplot(penguins, aes(y = flipper_length_mm, 
                     x = body_mass_g, 
                     color = species))+
  geom_point() +
  scale_color_manual(values=c("aquamarine", 
                              "deeppink1",
                              "indianred1"))

ggplot(penguins, aes(y = flipper_length_mm, 
                     x = body_mass_g, 
                     fill = species))+
  geom_boxplot() +
  scale_fill_manual(name = "Espécie", 
                    values=c("aquamarine",
                             "deeppink1",
                             "indianred1"))

ggplot(penguins, aes(y = flipper_length_mm, 
                     x = body_mass_g, 
                     color = species))+
  geom_point()+
  scale_color_manual(values=c("#81968F", 
                              "#E9D6EC",
                              "#F4D6C8")) +
  theme_classic()

RColorBrewer

ggplot(mpg) + 
  geom_point(aes(x = displ, 
                 y = hwy, 
                 color = class)) +
  scale_color_brewer(type="seq")

ggplot(mpg) + 
  geom_point(aes(x = displ, 
                 y = hwy, 
                 color = class)) +
  scale_color_brewer(type="div")

ggplot(mpg) + 
  geom_point(aes(x = displ, 
                 y = hwy, 
                 color = class)) +
  scale_color_brewer(type="qual")

Vamos ao R-Studio!

Outros gráficos

ggplot(penguins, aes(x = flipper_length_mm,
                     fill = species)) +
  geom_density_ridges(aes(y = species)) +
  scale_fill_brewer("Espécie", palette = "Set3")

pacman::p_load_gh("AllanCameron/geomtextpath")
ggplot(penguins, aes(x = body_mass_g, 
                     y = flipper_length_mm))+
  geom_point() +
   geom_labelsmooth(aes(label = "Linha de tendencia"), 
                    text_smoothing = 30, 
                    fill = "lightblue",
                    color= "indianred") +
  theme_classic()

Mapas com R

ggplot(mundo)+
  geom_sf(aes(geometry=geometry))

covid_mundo_com_shape_iso2 <- covid_mundo_com_shape_iso %>% 
  mutate(Acumulado_cat=cut(Acumulado,
                           breaks=c(-1,25000,320000,5000000, max(covid_mundo_com_shape_iso$Acumulado, na.rm=T)+1), labels=c("até 25 mil", "25 mil - 320 mil ", "320 mil - 5 milhão", "acima de 5 milhões")))
paleta<-c('#feebe2','#fbb4b9','#f768a1','#ae017e')
ggplot(covid_mundo_com_shape_iso2, fill="white")+
  geom_sf(aes(geometry=geometry, fill=Acumulado_cat ), color="purple", # cor da fronteira
              lwd=0.1) + # finura da fronteira
  scale_fill_manual(values=paleta, name="Casos Acumulados \n de covid-19  no Mundo")+
  theme_map(base_size=24)+
 theme(panel.background = element_rect(fill = "lightblue"),
       legend.position = "bottom")+
  ggtitle("Um mapa bonito")#oceano

Mais Dicas

Obrigada!